			.syntax unified
			.code 16
			.section .text
nvic_table:		.word 0x20001000 		/* Top of stack */
			.word startup + 1 		/* No space for interrupt vectors. */
startup:		ldr r0, rcc_base
			movs r1, #61
			orrs r1, #16384
			str r1, [r0, #0]
			movs r0, #2048
			movt r0, #16385
			movs r1, #2192
			str r1, [r0, #4]
			movs r0, #14336
			movt r0, #16385
			movw r1, #8204
			str r1, [r0, #12]
			movs r1, #69			/* 115200 baud */
			str r1, [r0, #8]
main:			movs r6, #32			/* Inlined */
			movs r5, #0
			adr r3, message_str
			bl string_out
main_handle_input:	bl byte_in
			cmp r1, #106
			beq.n main_input_j
			cmp r1, #107
			beq.n main_input_k
			cmp r1, #32
			beq.n main_input_space
			cmp r1, #13
			beq.n main_input_enter
			b.n main_handle_input
main_input_j:		cmp r6, #32
			bge.n main_handle_input
			lsls r6, #1
			adr r3, cur_down_str
			bl string_out
			b.n main_handle_input
main_input_k:		cmp r6, #1
			ble.n main_handle_input
			lsrs r6, #1
			adr r3, cur_up_str
			bl string_out
			b.n main_handle_input
main_input_space:	eors r5, r6
			tst r5, r6
			adr r3, asterisk_cur_left_str 	/* Flags not modified */
			bne.n main_skip
			adr r3, space_cur_left_str
main_skip:		bl string_out
			b.n main_handle_input
main_input_enter:	adr r3, clear_screen_str
			bl string_out
convert: 		adr r3, flo_str			/* Inlined */
			bl string_out			/* Mask to convert in r5 */
			subs r7, r7
convert_next_digit_in:	cmp r5, #10
			blt.n convert_next_digit_out
			movs r1, #10
			udiv r4, r5, r1
			mul r6, r4, r1
			subs r6, r5, r6
			push {r6}
			adds r7, r7, #2
			mov r5, r4
			b.n convert_next_digit_in
convert_next_digit_out:	adr r6, starts			/* Digit in r5, decimal place * 2 in r7 */
			ldrb r6, [r6, r5]
			adr r3, ends
			ldrb r3, [r3, r5]
convert_next_numeral:	cmp r6, r3
			bge.n convert_numerals_done
			adr r1, nums
			ldrb r1, [r1, r6]
			adds r1, r7
			adr r4, digits
			ldrb r1, [r4, r1]
			bl byte_out
			adds r6, #1
			b.n convert_next_numeral
convert_numerals_done:	subs r7, #2
			bmi.n convert_all_done
			pop {r5}
			b.n convert_next_digit_out
convert_all_done:	adr r3, ok_button_str
			bl string_out
			bl byte_in
			b.n main
string_out:		mov r4, lr			/* Takes argument in r3. Clobbers r1, r2, r4 */
string_out_loop:	ldrb r1, [r3], #1
			cbz r1, string_out_done
			bl byte_out
			b.n string_out_loop
string_out_done:	bx r4
byte_out:		ldr r2, [r0, #0]		/* Takes argument in r1. Clobbers r2. */
			tst r2, #128
			beq.n byte_out
			strb r1, [r0, #4]
			bx lr
byte_in:		ldr r1, [r0, #0]		/* Return value in r1. */
			tst r1, #32
			beq.n byte_in
			ldrb r1, [r0, #4]
			bx lr
rcc_base:		.word 0x40021018
ok_button_str:		.asciz "\r\n[OK]"
message_str:		.asciz "\033[2J\033[H dividuum\r\n syb\r\n fiji\r\n flowhase\r\n florolf\r\n piratenflo\r"
flo_str:		.asciz "FLO"
digits:			.ascii "IVXLCDM"
starts:			.byte 0, 2, 2, 2, 0, 1, 1, 1, 1, 4
ends:			.byte 0, 3, 4, 5, 2, 2, 3, 4, 5, 6
space_cur_left_str:	.asciz " \033[D"
asterisk_cur_left_str:	.asciz "*\033[D"	
clear_screen_str:	.asciz "\033[2J\033[H"
nums:			.byte 0, 1, 0, 0, 0, 2, 0 /* Padding */
cur_down_str:		.asciz "\033[B"
cur_up_str:		.asciz "\033[A"
